{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input_dim:  2 , output_dim:  3 , hidden_dim:  16\n",
      "threshold:  -110.0\n"
     ]
    }
   ],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "\n",
    "from collections import deque\n",
    "from agent import Agent, FloatTensor\n",
    "from replay_buffer import ReplayMemory, Transition\n",
    "from  torch.autograd import Variable\n",
    "\n",
    "# set up matplotlib\n",
    "is_ipython = 'inline' in matplotlib.get_backend()\n",
    "if is_ipython:\n",
    "    from IPython import display\n",
    "\n",
    "plt.ion()\n",
    "\n",
    "use_cuda = torch.cuda.is_available()\n",
    "FloatTensor = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor\n",
    "device = torch.device(\"cuda\" if use_cuda else \"cpu\")\n",
    "\n",
    "BATCH_SIZE = 64  \n",
    "TAU = 0.005 # 1e-3   # for soft update of target parameters\n",
    "gamma = 0.99\n",
    "LEARNING_RATE = 0.01 ##  0.001\n",
    "TARGET_UPDATE = 10\n",
    "\n",
    "num_episodes = 100000\n",
    "print_every = 10\n",
    "hidden_dim = 16 ## 64 ## 16\n",
    "min_eps = 0.01\n",
    "max_eps_episode = 50\n",
    "\n",
    "env = gym.make('MountainCar-v0')\n",
    "## env = gym.wrappers.Monitor(env, directory=\"monitors\", force=True)\n",
    "        \n",
    "space_dim =  env.observation_space.shape[0] # n_spaces\n",
    "action_dim = env.action_space.n # n_actions  \n",
    "print('input_dim: ', space_dim, ', output_dim: ', action_dim, ', hidden_dim: ', hidden_dim)\n",
    "\n",
    "threshold = env.spec.reward_threshold\n",
    "print('threshold: ', threshold)\n",
    "\n",
    "agent = Agent(space_dim, action_dim, hidden_dim, lr = LEARNING_RATE, device=device)\n",
    "\n",
    "    \n",
    "def epsilon_annealing(i_epsiode, max_episode, min_eps: float):\n",
    "    ##  if i_epsiode --> max_episode, ret_eps --> min_eps\n",
    "    ##  if i_epsiode --> 1, ret_eps --> 1  \n",
    "    slope = (min_eps - 1.0) / max_episode\n",
    "    ret_eps = max(slope * i_epsiode + 1.0, min_eps)\n",
    "    return ret_eps        \n",
    "\n",
    "def save(directory, filename):\n",
    "    torch.save(agent.q_local.state_dict(), '%s/%s_local.pth' % (directory, filename))\n",
    "    torch.save(agent.q_target.state_dict(), '%s/%s_target.pth' % (directory, filename))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_episode(env, agent, eps):\n",
    "    \"\"\"Play an epsiode and train\n",
    "\n",
    "    Args:\n",
    "        env (gym.Env): gym environment (CartPole-v0)\n",
    "        agent (Agent): agent will train and get action        \n",
    "        eps (float): eps-greedy for exploration\n",
    "\n",
    "    Returns:\n",
    "        int: reward earned in this episode\n",
    "    \"\"\"\n",
    "    state = env.reset()\n",
    "    done = False\n",
    "    total_reward = 0\n",
    "    \n",
    "\n",
    "    while not done:\n",
    "\n",
    "        action = agent.get_action(FloatTensor([state]) , eps)\n",
    "        \n",
    "        next_state, reward, done, _ = env.step(action.item())\n",
    "\n",
    "        total_reward += reward\n",
    "\n",
    "        if done:\n",
    "            reward = -1\n",
    "                    \n",
    "        # Store the transition in memory\n",
    "        agent.replay_memory.push(\n",
    "                (FloatTensor([state]), \n",
    "                 action, # action is already a tensor\n",
    "                 FloatTensor([reward]), \n",
    "                 FloatTensor([next_state]), \n",
    "                 FloatTensor([done])))\n",
    "                 \n",
    "\n",
    "        if len(agent.replay_memory) > BATCH_SIZE:\n",
    "\n",
    "            batch = agent.replay_memory.sample(BATCH_SIZE)\n",
    "            \n",
    "            agent.learn(batch, gamma)\n",
    "\n",
    "        state = next_state\n",
    "\n",
    "\n",
    "    return total_reward\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode:    10 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.802 Time: 00:00:35\n",
      "Episode:    20 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.604 Time: 00:01:10\n",
      "Episode:    30 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.406 Time: 00:01:54\n",
      "Episode:    40 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.208 Time: 00:02:47\n",
      "Episode:    50 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:03:33\n",
      "Episode:    60 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:04:20\n",
      "Episode:    70 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:05:07\n",
      "Episode:    80 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:05:51\n",
      "Episode:    90 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:06:37\n",
      "Episode:   100 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:07:22\n",
      "Episode:   110 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:08:09\n",
      "Episode:   120 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:09:18\n",
      "Episode:   130 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:10:12\n",
      "Episode:   140 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:11:02\n",
      "Episode:   150 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:11:49\n",
      "Episode:   160 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:12:36\n",
      "Episode:   170 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:13:25\n",
      "Episode:   180 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:14:12\n",
      "Episode:   190 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:14:59\n",
      "Episode:   200 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:15:44\n",
      "Episode:   210 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:16:33\n",
      "Episode:   220 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:17:21\n",
      "Episode:   230 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:18:10\n",
      "Episode:   240 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:18:56\n",
      "Episode:   250 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:19:39\n",
      "Episode:   260 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:20:14\n",
      "Episode:   270 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:20:48\n",
      "Episode:   280 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:21:23\n",
      "Episode:   290 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:21:57\n",
      "Episode:   300 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:22:32\n",
      "Episode:   310 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:23:08\n",
      "Episode:   320 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:23:46\n",
      "Episode:   330 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:24:23\n",
      "Episode:   340 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:25:00\n",
      "Episode:   350 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:25:40\n",
      "Episode:   360 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:26:15\n",
      "Episode:   370 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:26:54\n",
      "Episode:   380 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:27:32\n",
      "Episode:   390 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:28:08\n",
      "Episode:   400 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:28:45\n",
      "Episode:   410 Score: -200.0  Avg.Score: -199.96, eps-greedy: 0.010 Time: 00:29:23\n",
      "Episode:   420 Score: -200.0  Avg.Score: -199.58, eps-greedy: 0.010 Time: 00:29:59\n",
      "Episode:   430 Score: -200.0  Avg.Score: -199.58, eps-greedy: 0.010 Time: 00:30:39\n",
      "Episode:   440 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:31:20\n",
      "Episode:   450 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:31:57\n",
      "Episode:   460 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:32:43\n",
      "Episode:   470 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:33:30\n",
      "Episode:   480 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:34:16\n",
      "Episode:   490 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:35:01\n",
      "Episode:   500 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:35:46\n",
      "Episode:   510 Score: -200.0  Avg.Score: -199.62, eps-greedy: 0.010 Time: 00:36:31\n",
      "Episode:   520 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:37:16\n",
      "Episode:   530 Score: -200.0  Avg.Score: -200.00, eps-greedy: 0.010 Time: 00:38:03\n",
      "Episode:   540 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:38:47\n",
      "Episode:   550 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:39:33\n",
      "Episode:   560 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:40:17\n",
      "Episode:   570 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:41:03\n",
      "Episode:   580 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:41:48\n",
      "Episode:   590 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:42:33\n",
      "Episode:   600 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:43:18\n",
      "Episode:   610 Score: -200.0  Avg.Score: -199.59, eps-greedy: 0.010 Time: 00:44:03\n",
      "Episode:   620 Score: -200.0  Avg.Score: -199.40, eps-greedy: 0.010 Time: 00:44:49\n",
      "Episode:   630 Score: -200.0  Avg.Score: -198.79, eps-greedy: 0.010 Time: 00:45:33\n",
      "Episode:   640 Score: -200.0  Avg.Score: -197.23, eps-greedy: 0.010 Time: 00:46:14\n",
      "Episode:   650 Score: -200.0  Avg.Score: -195.27, eps-greedy: 0.010 Time: 00:46:55\n",
      "Episode:   660 Score: -200.0  Avg.Score: -194.68, eps-greedy: 0.010 Time: 00:47:39\n",
      "Episode:   670 Score: -200.0  Avg.Score: -192.92, eps-greedy: 0.010 Time: 00:48:20\n",
      "Episode:   680 Score: -200.0  Avg.Score: -192.92, eps-greedy: 0.010 Time: 00:49:05\n",
      "Episode:   690 Score: -200.0  Avg.Score: -191.95, eps-greedy: 0.010 Time: 00:49:48\n",
      "Episode:   700 Score: -200.0  Avg.Score: -191.11, eps-greedy: 0.010 Time: 00:50:31\n",
      "Episode:   710 Score: -200.0  Avg.Score: -190.42, eps-greedy: 0.010 Time: 00:51:14\n",
      "Episode:   720 Score: -200.0  Avg.Score: -190.06, eps-greedy: 0.010 Time: 00:51:59\n",
      "Episode:   730 Score: -200.0  Avg.Score: -188.89, eps-greedy: 0.010 Time: 00:52:40\n",
      "Episode:   740 Score: -200.0  Avg.Score: -190.08, eps-greedy: 0.010 Time: 00:53:23\n",
      "Episode:   750 Score: -191.0  Avg.Score: -191.21, eps-greedy: 0.010 Time: 00:54:06\n",
      "Episode:   760 Score: -200.0  Avg.Score: -189.55, eps-greedy: 0.010 Time: 00:54:46\n",
      "Episode:   770 Score: -200.0  Avg.Score: -190.57, eps-greedy: 0.010 Time: 00:55:30\n",
      "Episode:   780 Score: -200.0  Avg.Score: -190.57, eps-greedy: 0.010 Time: 00:56:14\n",
      "Episode:   790 Score: -175.0  Avg.Score: -191.29, eps-greedy: 0.010 Time: 00:57:06\n",
      "Episode:   800 Score: -200.0  Avg.Score: -191.43, eps-greedy: 0.010 Time: 00:57:55\n",
      "Episode:   810 Score: -200.0  Avg.Score: -190.60, eps-greedy: 0.010 Time: 00:58:36\n",
      "Episode:   820 Score: -162.0  Avg.Score: -188.33, eps-greedy: 0.010 Time: 00:59:14\n",
      "Episode:   830 Score: -200.0  Avg.Score: -189.42, eps-greedy: 0.010 Time: 00:59:58\n",
      "Episode:   840 Score: -168.0  Avg.Score: -188.36, eps-greedy: 0.010 Time: 01:00:38\n",
      "Episode:   850 Score: -200.0  Avg.Score: -187.91, eps-greedy: 0.010 Time: 01:01:21\n",
      "Episode:   860 Score: -140.0  Avg.Score: -189.31, eps-greedy: 0.010 Time: 01:02:04\n",
      "Episode:   870 Score: -200.0  Avg.Score: -187.63, eps-greedy: 0.010 Time: 01:02:41\n",
      "Episode:   880 Score: -200.0  Avg.Score: -186.05, eps-greedy: 0.010 Time: 01:03:20\n",
      "Episode:   890 Score: -177.0  Avg.Score: -184.64, eps-greedy: 0.010 Time: 01:03:57\n",
      "Episode:   900 Score: -196.0  Avg.Score: -184.12, eps-greedy: 0.010 Time: 01:04:36\n",
      "Episode:   910 Score: -200.0  Avg.Score: -185.55, eps-greedy: 0.010 Time: 01:05:16\n",
      "Episode:   920 Score: -200.0  Avg.Score: -188.29, eps-greedy: 0.010 Time: 01:05:58\n",
      "Episode:   930 Score: -174.0  Avg.Score: -188.21, eps-greedy: 0.010 Time: 01:06:37\n",
      "Episode:   940 Score: -200.0  Avg.Score: -188.61, eps-greedy: 0.010 Time: 01:07:15\n",
      "Episode:   950 Score: -200.0  Avg.Score: -187.27, eps-greedy: 0.010 Time: 01:07:51\n",
      "Episode:   960 Score: -200.0  Avg.Score: -186.93, eps-greedy: 0.010 Time: 01:08:30\n",
      "Episode:   970 Score: -121.0  Avg.Score: -183.51, eps-greedy: 0.010 Time: 01:08:59\n",
      "Episode:   980 Score: -200.0  Avg.Score: -182.67, eps-greedy: 0.010 Time: 01:09:35\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode:   990 Score: -148.0  Avg.Score: -178.99, eps-greedy: 0.010 Time: 01:10:04\n",
      "Episode:  1000 Score: -105.0  Avg.Score: -178.88, eps-greedy: 0.010 Time: 01:10:40\n",
      "Episode:  1010 Score: -200.0  Avg.Score: -175.99, eps-greedy: 0.010 Time: 01:11:12\n",
      "Episode:  1020 Score: -200.0  Avg.Score: -172.18, eps-greedy: 0.010 Time: 01:11:44\n",
      "Episode:  1030 Score: -200.0  Avg.Score: -171.11, eps-greedy: 0.010 Time: 01:12:19\n",
      "Episode:  1040 Score: -180.0  Avg.Score: -168.84, eps-greedy: 0.010 Time: 01:12:51\n",
      "Episode:  1050 Score: -140.0  Avg.Score: -167.91, eps-greedy: 0.010 Time: 01:13:23\n",
      "Episode:  1060 Score: -118.0  Avg.Score: -164.05, eps-greedy: 0.010 Time: 01:13:52\n",
      "Episode:  1070 Score: -140.0  Avg.Score: -165.69, eps-greedy: 0.010 Time: 01:14:23\n",
      "Episode:  1080 Score: -112.0  Avg.Score: -163.31, eps-greedy: 0.010 Time: 01:14:52\n",
      "Episode:  1090 Score: -159.0  Avg.Score: -166.50, eps-greedy: 0.010 Time: 01:15:27\n",
      "Episode:  1100 Score: -200.0  Avg.Score: -163.93, eps-greedy: 0.010 Time: 01:15:58\n",
      "Episode:  1110 Score: -175.0  Avg.Score: -165.31, eps-greedy: 0.010 Time: 01:16:34\n",
      "Episode:  1120 Score: -200.0  Avg.Score: -167.42, eps-greedy: 0.010 Time: 01:17:09\n",
      "Episode:  1130 Score: -141.0  Avg.Score: -166.56, eps-greedy: 0.010 Time: 01:17:43\n",
      "Episode:  1140 Score: -149.0  Avg.Score: -165.35, eps-greedy: 0.010 Time: 01:18:12\n",
      "Episode:  1150 Score: -157.0  Avg.Score: -165.23, eps-greedy: 0.010 Time: 01:18:43\n",
      "Episode:  1160 Score: -200.0  Avg.Score: -165.90, eps-greedy: 0.010 Time: 01:19:13\n",
      "Episode:  1170 Score: -138.0  Avg.Score: -165.53, eps-greedy: 0.010 Time: 01:19:44\n",
      "Episode:  1180 Score: -154.0  Avg.Score: -165.14, eps-greedy: 0.010 Time: 01:20:13\n",
      "Episode:  1190 Score: -176.0  Avg.Score: -161.44, eps-greedy: 0.010 Time: 01:20:40\n",
      "Episode:  1200 Score: -132.0  Avg.Score: -158.44, eps-greedy: 0.010 Time: 01:21:05\n",
      "Episode:  1210 Score: -122.0  Avg.Score: -153.92, eps-greedy: 0.010 Time: 01:21:32\n",
      "Episode:  1220 Score: -97.0  Avg.Score: -147.10, eps-greedy: 0.010 Time: 01:21:54\n",
      "Episode:  1230 Score: -92.0  Avg.Score: -143.70, eps-greedy: 0.010 Time: 01:22:21\n",
      "Episode:  1240 Score: -150.0  Avg.Score: -142.47, eps-greedy: 0.010 Time: 01:22:48\n",
      "Episode:  1250 Score: -106.0  Avg.Score: -138.09, eps-greedy: 0.010 Time: 01:23:11\n",
      "Episode:  1260 Score: -99.0  Avg.Score: -138.64, eps-greedy: 0.010 Time: 01:23:42\n",
      "Episode:  1270 Score: -92.0  Avg.Score: -137.74, eps-greedy: 0.010 Time: 01:24:10\n",
      "Episode:  1280 Score: -167.0  Avg.Score: -135.36, eps-greedy: 0.010 Time: 01:24:34\n",
      "Episode:  1290 Score: -115.0  Avg.Score: -132.81, eps-greedy: 0.010 Time: 01:24:56\n",
      "Episode:  1300 Score: -176.0  Avg.Score: -131.07, eps-greedy: 0.010 Time: 01:25:18\n",
      "Episode:  1310 Score: -90.0  Avg.Score: -129.37, eps-greedy: 0.010 Time: 01:25:42\n",
      "Episode:  1320 Score: -169.0  Avg.Score: -130.14, eps-greedy: 0.010 Time: 01:26:02\n",
      "Episode:  1330 Score: -116.0  Avg.Score: -129.07, eps-greedy: 0.010 Time: 01:26:22\n",
      "Episode:  1340 Score: -164.0  Avg.Score: -126.82, eps-greedy: 0.010 Time: 01:26:40\n",
      "Episode:  1350 Score: -111.0  Avg.Score: -126.51, eps-greedy: 0.010 Time: 01:26:58\n",
      "Episode:  1360 Score: -87.0  Avg.Score: -122.79, eps-greedy: 0.010 Time: 01:27:18\n",
      "Episode:  1370 Score: -132.0  Avg.Score: -120.38, eps-greedy: 0.010 Time: 01:27:36\n",
      "Episode:  1380 Score: -120.0  Avg.Score: -120.74, eps-greedy: 0.010 Time: 01:27:56\n",
      "Episode:  1390 Score: -107.0  Avg.Score: -119.86, eps-greedy: 0.010 Time: 01:28:13\n",
      "Episode:  1400 Score: -115.0  Avg.Score: -120.79, eps-greedy: 0.010 Time: 01:28:32\n",
      "Episode:  1410 Score: -124.0  Avg.Score: -120.53, eps-greedy: 0.010 Time: 01:28:51\n",
      "Episode:  1420 Score: -90.0  Avg.Score: -118.65, eps-greedy: 0.010 Time: 01:29:08\n",
      "Episode:  1430 Score: -117.0  Avg.Score: -116.87, eps-greedy: 0.010 Time: 01:29:25\n",
      "Episode:  1440 Score: -95.0  Avg.Score: -116.81, eps-greedy: 0.010 Time: 01:29:43\n",
      "Episode:  1450 Score: -86.0  Avg.Score: -115.93, eps-greedy: 0.010 Time: 01:29:59\n",
      "Episode:  1460 Score: -108.0  Avg.Score: -113.88, eps-greedy: 0.010 Time: 01:30:15\n",
      "Episode:  1470 Score: -116.0  Avg.Score: -114.01, eps-greedy: 0.010 Time: 01:30:34\n",
      "Episode:  1480 Score: -115.0  Avg.Score: -112.79, eps-greedy: 0.010 Time: 01:30:51\n",
      "Episode:  1490 Score: -102.0  Avg.Score: -114.14, eps-greedy: 0.010 Time: 01:31:10\n",
      "Episode:  1500 Score: -109.0  Avg.Score: -114.37, eps-greedy: 0.010 Time: 01:31:29\n",
      "Episode:  1510 Score: -101.0  Avg.Score: -116.52, eps-greedy: 0.010 Time: 01:31:50\n",
      "Episode:  1520 Score: -113.0  Avg.Score: -117.04, eps-greedy: 0.010 Time: 01:32:07\n",
      "Episode:  1530 Score: -114.0  Avg.Score: -117.70, eps-greedy: 0.010 Time: 01:32:25\n",
      "Episode:  1540 Score: -102.0  Avg.Score: -117.44, eps-greedy: 0.010 Time: 01:32:42\n",
      "Episode:  1550 Score: -118.0  Avg.Score: -117.91, eps-greedy: 0.010 Time: 01:33:00\n",
      "Episode:  1560 Score: -111.0  Avg.Score: -118.84, eps-greedy: 0.010 Time: 01:33:17\n",
      "Episode:  1570 Score: -110.0  Avg.Score: -118.15, eps-greedy: 0.010 Time: 01:33:35\n",
      "Episode:  1580 Score: -117.0  Avg.Score: -118.21, eps-greedy: 0.010 Time: 01:33:53\n",
      "Episode:  1590 Score: -115.0  Avg.Score: -117.50, eps-greedy: 0.010 Time: 01:34:10\n",
      "Episode:  1600 Score: -110.0  Avg.Score: -116.02, eps-greedy: 0.010 Time: 01:34:27\n",
      "Episode:  1610 Score: -113.0  Avg.Score: -113.30, eps-greedy: 0.010 Time: 01:34:44\n",
      "Episode:  1620 Score: -110.0  Avg.Score: -113.94, eps-greedy: 0.010 Time: 01:35:02\n",
      "Episode:  1630 Score: -109.0  Avg.Score: -113.69, eps-greedy: 0.010 Time: 01:35:20\n",
      "Episode:  1640 Score: -90.0  Avg.Score: -114.13, eps-greedy: 0.010 Time: 01:35:38\n",
      "Episode:  1650 Score: -110.0  Avg.Score: -114.98, eps-greedy: 0.010 Time: 01:35:56\n",
      "Episode:  1660 Score: -110.0  Avg.Score: -115.67, eps-greedy: 0.010 Time: 01:36:15\n",
      "Episode:  1670 Score: -86.0  Avg.Score: -115.34, eps-greedy: 0.010 Time: 01:36:32\n",
      "Episode:  1680 Score: -178.0  Avg.Score: -115.52, eps-greedy: 0.010 Time: 01:36:51\n",
      "Episode:  1690 Score: -181.0  Avg.Score: -115.49, eps-greedy: 0.010 Time: 01:37:08\n",
      "Episode:  1700 Score: -105.0  Avg.Score: -116.54, eps-greedy: 0.010 Time: 01:37:27\n",
      "Episode:  1710 Score: -105.0  Avg.Score: -115.92, eps-greedy: 0.010 Time: 01:37:43\n",
      "Episode:  1720 Score: -104.0  Avg.Score: -115.19, eps-greedy: 0.010 Time: 01:38:00\n",
      "Episode:  1730 Score: -112.0  Avg.Score: -115.08, eps-greedy: 0.010 Time: 01:38:17\n",
      "Episode:  1740 Score: -109.0  Avg.Score: -114.50, eps-greedy: 0.010 Time: 01:38:34\n",
      "Episode:  1750 Score: -104.0  Avg.Score: -112.74, eps-greedy: 0.010 Time: 01:38:50\n",
      "Episode:  1760 Score: -91.0  Avg.Score: -111.35, eps-greedy: 0.010 Time: 01:39:06\n",
      "Episode:  1770 Score: -104.0  Avg.Score: -110.76, eps-greedy: 0.010 Time: 01:39:22\n",
      "Episode:  1780 Score: -107.0  Avg.Score: -112.90, eps-greedy: 0.010 Time: 01:39:44\n",
      "Episode:  1790 Score: -104.0  Avg.Score: -112.66, eps-greedy: 0.010 Time: 01:40:01\n",
      "Episode:  1800 Score: -105.0  Avg.Score: -111.67, eps-greedy: 0.010 Time: 01:40:19\n",
      "Episode:  1810 Score: -164.0  Avg.Score: -111.84, eps-greedy: 0.010 Time: 01:40:35\n",
      "Episode:  1820 Score: -107.0  Avg.Score: -110.90, eps-greedy: 0.010 Time: 01:40:50\n",
      "Episode:  1830 Score: -86.0  Avg.Score: -110.42, eps-greedy: 0.010 Time: 01:41:07\n",
      "\n",
      " Environment solved in 1834 episodes!\tAverage Score: -109.95\n"
     ]
    }
   ],
   "source": [
    "def train():    \n",
    "\n",
    "    scores_deque = deque(maxlen=100)\n",
    "    scores_array = []\n",
    "    avg_scores_array = []    \n",
    "    \n",
    "    time_start = time.time()\n",
    "\n",
    "    for i_episode in range(num_episodes):\n",
    "        eps = epsilon_annealing(i_episode, max_eps_episode, min_eps)\n",
    "        score = run_episode(env, agent, eps)\n",
    "\n",
    "        scores_deque.append(score)\n",
    "        scores_array.append(score)\n",
    "        \n",
    "        avg_score = np.mean(scores_deque)\n",
    "        avg_scores_array.append(avg_score)\n",
    "\n",
    "        dt = (int)(time.time() - time_start)\n",
    "            \n",
    "        if i_episode % print_every == 0 and i_episode > 0:\n",
    "            print('Episode: {:5} Score: {:5}  Avg.Score: {:.2f}, eps-greedy: {:5.3f} Time: {:02}:{:02}:{:02}'.\\\n",
    "                    format(i_episode, score, avg_score, eps, dt//3600, dt%3600//60, dt%60))\n",
    "            \n",
    "        if len(scores_deque) == 100 and  avg_score >= threshold: \n",
    "                print('\\n Environment solved in {:d} episodes!\\tAverage Score: {:.2f}'. \\\n",
    "                    format(i_episode, np.mean(scores_deque)))\n",
    "                break\n",
    "                        \n",
    "        if i_episode % TARGET_UPDATE == 0:\n",
    "            agent.q_target.load_state_dict(agent.q_local.state_dict()) \n",
    "    \n",
    "    return scores_array, avg_scores_array\n",
    "\n",
    "scores, avg_scores = train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "length of scores:  1835 , len of avg_scores:  1835\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "print('length of scores: ', len(scores), ', len of avg_scores: ', len(avg_scores))\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "plt.plot(np.arange(1, len(scores)+1), scores, label=\"Score\")\n",
    "plt.plot(np.arange(1, len(avg_scores)+1), avg_scores, label=\"Avg on 100 episodes\")\n",
    "plt.legend(bbox_to_anchor=(1.05, 1)) \n",
    "plt.ylabel('Score')\n",
    "plt.xlabel('Episodes #')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "save('dir_chk', 'MountainCar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ml2-kernel",
   "language": "python",
   "name": "ml2-kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
